/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entities;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author damfercer
 */
@Entity
@Table(name = "producto_talla", catalog = "corporate", schema = "")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "ProductoTalla.findAll", query = "SELECT p FROM ProductoTalla p"),
    @NamedQuery(name = "ProductoTalla.findByProductoYTalla", query = "SELECT p FROM ProductoTalla p WHERE p.producto.idProducto=:idProducto AND p.talla.idTalla=:idTalla"),
    @NamedQuery(name = "ProductoTalla.findProductosTallaRestantesDePedido", query = "SELECT lp.productoTalla FROM LineaPedido lp, FacturaMultimarca fm WHERE fm.pedido=lp.pedido AND fm.idFacturaMultimarca=:idFacturaMultimarca"),
    @NamedQuery(name = "ProductoTalla.findProductosTallaNoFactura", query = "SELECT lp.productoTalla FROM LineaPedido lp WHERE lp.pedido.idPedido=:idPedido AND lp.productoTalla.idProductoTalla NOT IN (SELECT lfm2.productoTalla.idProductoTalla FROM LineaFacturaMultimarca lfm2 WHERE lfm2.factura.idFacturaMultimarca=:idFacturaMultimarca)"),
    @NamedQuery(name = "ProductoTalla.findByCodigoBarras", query = "SELECT p FROM ProductoTalla p WHERE p.codigoBarras = :codigoBarras"),
    @NamedQuery(name = "ProductoTalla.findByPedidoFabrica", query = "SELECT DISTINCT p FROM ProductoTalla p, LineaPedidoFabrica lpf WHERE lpf.productoTalla.idProductoTalla=p.idProductoTalla AND lpf.pedidoFabrica.idPedidoFabrica = :idPedidoFabrica"),
    @NamedQuery(name = "ProductoTalla.findByIdProductoTalla", query = "SELECT p FROM ProductoTalla p WHERE p.idProductoTalla = :idProductoTalla")})
public class ProductoTalla implements Serializable,Comparable<ProductoTalla> {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<LineaTicket> lineaTicketList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<LineaPeticionTraspasoMercancia> lineaPeticionTraspasoMercanciaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<LocalizacionAlmacenProductoTalla> localizacionAlmacenProductoTallaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<LineaInventarioAlmacen> lineaInventarioAlmacenList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<LineaEnvioTraspasoMercancia> lineaEnvioTraspasoMercanciaList;
    @Column(name = "CODIGO_BARRAS")
    private BigInteger codigoBarras;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<LineaFacturaPedidoFabrica> lineaFacturaPedidoFabricaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<LineaFacturaMultimarca> lineaFacturaMultimarcaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<LineaPedidoFabrica> lineaPedidoFabricaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<Estimacion> estimacionList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productoTalla")
    private List<LineaPedido> lineaPedidoList;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_PRODUCTO_TALLA")
    private Integer idProductoTalla;
    @JoinColumn(name = "PRODUCTO", referencedColumnName = "ID_PRODUCTO")
    @ManyToOne(optional = false)
    private Producto producto;
    @JoinColumn(name = "TALLA", referencedColumnName = "ID_TALLA")
    @ManyToOne(optional = false)
    private Talla talla;

    public ProductoTalla() {
    }

    public ProductoTalla(Integer idProductoTalla) {
        this.idProductoTalla = idProductoTalla;
    }

    public Integer getIdProductoTalla() {
        return idProductoTalla;
    }

    public void setIdProductoTalla(Integer idProductoTalla) {
        this.idProductoTalla = idProductoTalla;
    }

    public Producto getProducto() {
        return producto;
    }

    public void setProducto(Producto producto) {
        this.producto = producto;
    }

    public Talla getTalla() {
        return talla;
    }

    public void setTalla(Talla talla) {
        this.talla = talla;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idProductoTalla != null ? idProductoTalla.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof ProductoTalla)) {
            return false;
        }
        ProductoTalla other = (ProductoTalla) object;
        if ((this.idProductoTalla == null && other.idProductoTalla != null) || (this.idProductoTalla != null && !this.idProductoTalla.equals(other.idProductoTalla))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.ProductoTalla[ idProductoTalla=" + idProductoTalla + " ]";
    }

    @XmlTransient
    public List<LineaPedido> getLineaPedidoList() {
        return lineaPedidoList;
    }

    public void setLineaPedidoList(List<LineaPedido> lineaPedidoList) {
        this.lineaPedidoList = lineaPedidoList;
    }

    @XmlTransient
    public List<Estimacion> getEstimacionList() {
        return estimacionList;
    }

    public void setEstimacionList(List<Estimacion> estimacionList) {
        this.estimacionList = estimacionList;
    }

    @XmlTransient
    public List<LineaPedidoFabrica> getLineaPedidoFabricaList() {
        return lineaPedidoFabricaList;
    }

    public void setLineaPedidoFabricaList(List<LineaPedidoFabrica> lineaPedidoFabricaList) {
        this.lineaPedidoFabricaList = lineaPedidoFabricaList;
    }

    @XmlTransient
    public List<LineaFacturaMultimarca> getLineaFacturaMultimarcaList() {
        return lineaFacturaMultimarcaList;
    }

    public void setLineaFacturaMultimarcaList(List<LineaFacturaMultimarca> lineaFacturaMultimarcaList) {
        this.lineaFacturaMultimarcaList = lineaFacturaMultimarcaList;
    }

    @XmlTransient
    public List<LineaFacturaPedidoFabrica> getLineaFacturaPedidoFabricaList() {
        return lineaFacturaPedidoFabricaList;
    }

    public void setLineaFacturaPedidoFabricaList(List<LineaFacturaPedidoFabrica> lineaFacturaPedidoFabricaList) {
        this.lineaFacturaPedidoFabricaList = lineaFacturaPedidoFabricaList;
    }

    @Override
    public int compareTo(ProductoTalla t) {
        Integer res=0;
        if(this.producto.getSerieTallaje().equals(t.getProducto().getSerieTallaje())){
            Integer ordenacionThis=this.getOrdenacion();
            Integer ordenacionOther=t.getOrdenacion();
            res=ordenacionThis.compareTo(ordenacionOther);
        }
        return res;
    }
    
    private Integer getOrdenacion(){
        Integer ordenacion=1;
        for(TallaSerieTallaje tallaSerieTallaje: this.getProducto().getSerieTallaje().getTallaSerieTallajeList()){
            if(tallaSerieTallaje.getTalla().equals(this.getTalla())){
                ordenacion=tallaSerieTallaje.getOrdenacion(); 
                break;
            }
        }
        return ordenacion;
    }

    public BigInteger getCodigoBarras() {
        return codigoBarras;
    }

    public void setCodigoBarras(BigInteger codigoBarras) {
        this.codigoBarras = codigoBarras;
    }

    @XmlTransient
    public List<LineaPeticionTraspasoMercancia> getLineaPeticionTraspasoMercanciaList() {
        return lineaPeticionTraspasoMercanciaList;
    }

    public void setLineaPeticionTraspasoMercanciaList(List<LineaPeticionTraspasoMercancia> lineaPeticionTraspasoMercanciaList) {
        this.lineaPeticionTraspasoMercanciaList = lineaPeticionTraspasoMercanciaList;
    }

    @XmlTransient
    public List<LocalizacionAlmacenProductoTalla> getLocalizacionAlmacenProductoTallaList() {
        return localizacionAlmacenProductoTallaList;
    }

    public void setLocalizacionAlmacenProductoTallaList(List<LocalizacionAlmacenProductoTalla> localizacionAlmacenProductoTallaList) {
        this.localizacionAlmacenProductoTallaList = localizacionAlmacenProductoTallaList;
    }

    @XmlTransient
    public List<LineaInventarioAlmacen> getLineaInventarioAlmacenList() {
        return lineaInventarioAlmacenList;
    }

    public void setLineaInventarioAlmacenList(List<LineaInventarioAlmacen> lineaInventarioAlmacenList) {
        this.lineaInventarioAlmacenList = lineaInventarioAlmacenList;
    }

    @XmlTransient
    public List<LineaEnvioTraspasoMercancia> getLineaEnvioTraspasoMercanciaList() {
        return lineaEnvioTraspasoMercanciaList;
    }

    public void setLineaEnvioTraspasoMercanciaList(List<LineaEnvioTraspasoMercancia> lineaEnvioTraspasoMercanciaList) {
        this.lineaEnvioTraspasoMercanciaList = lineaEnvioTraspasoMercanciaList;
    }

    @XmlTransient
    public List<LineaTicket> getLineaTicketList() {
        return lineaTicketList;
    }

    public void setLineaTicketList(List<LineaTicket> lineaTicketList) {
        this.lineaTicketList = lineaTicketList;
    }
        
}
